---------> Furb3T <---------

presenta:

Dongle: primi passi.


Attenzione : il materiale che trovate in questo tutorial � a puro scopo didattico.


    Cari studenti, oggi affronteremo un tipo di protezione che ultimamente va per la maggiore: la chiave hardware, in inglese Dongle. Questa protezione consiste in un plug che si inserisce nella porta parallela del computer dove dovrebbe girare quel determinato programma; questo non fa altro che verificare se � inserita questa chiave nella porta ( I problema da superare), dopodich� passer� il controllo alla chiave che verificher� alcuni requisiti ( II problema da superare). Avrete capito, quindi, che per i nostri scopi, in primo luogo bisogner� far vedere al prg la chiave hardware e in secondo luogo dovremmo capire qual � lo schema di protezione che viene elaborato nella chiave per superare quest'altro scoglio. Vorrei fare alcune precisazioni: esistono diversi tipi di chiavi hw, nel momento in cui riconoscete il momento vi suggerisco di andare nel sito dei costruttori di quella chiave e leggere le caratteristiche, ci� vi aiuter� nell'affrontare meglio il problema; altra precisazione: le chiavi hw possono essere delle cose facilissime da bypassare, ma non tutte sono cos� anzi alcune di queste potrebbero svolgere alcune routine del prg, ed in questo caso sarebbe difficile ricostruire tutta la routine, ma il nostro motto � non scoraggiarsi mai, anzi � proprio dalle difficolt� che si matura e si trovano nuove strade da percorrere.

    Iniziamo a muoverci!!! Il prg ( molto semplice ) che ho preso come riferimento � CpsWin32 versione 1.15,  e lo strumento che utilizzeremo � come al solito Softice. Lanciate il prg e noterete subito che compare una MessageBox che vi dice che non avete la Chiave!!! Qualcuno di voi subito avr� pensato di settare un Bpx MessageBoxA, e l'idea non sarebbe malvagia; tuttavia, noi dobbiamo risolvere i 2 problemi che ho descritto sopra, e settare un Bpx MessageBoxA ci porterebbe troppo avanti nel codice da analizzare. Il nostro interesse � per prima cosa individuare il punto dove viene vista la presenza della chiave, a tal fine dobbiamo settare Bpio -h 378 rw. Bpio vuol dire break point input output settato sulla porta 378 che di solito � la porta parallela (altre volte la porta parallela potrebbe essere la 278). Lanciate il prg e....voil� siete dentro Sice ed esattamente vi troverete all'interno di Sc32w.dll . Disabilitate il Bpio ( Bd *) e premete F12 per ritornare alla call che chiama la dll. Arriverete a questo punto:

00419082 CALL 0056859B ----> chiama la dll e probabilmente inizializza la
00419087 MOV DWORD PTR [EBP-1C], AX   chiave. Osservate come nelle
0041908B MOV EDX, DWORD PTR [EBP-1C]
istruzioni che seguono il valore di
0041908E AND EDX, 0000FFFF
  EDX venga variato fino a diventare = FFFF, ci�
00419094 TEST EDX,EDX
  dovrebbe far pensare che il JZ non dovrebbe essere
00419096 JZ 004190C5 
rilevante ai nostri fini.

  Continuiamo quindi a steppare per vedere cosa succede e se le nostre intuizioni erano giuste:

004190C5 MOV DWORD PTR [0075F5F4], 0000
004190E2 XOR EDX,EDX
---> EDX viene azzerato (Possibile inizializzazione?)
004190E4 MOV DX, DWORD PTR [0075F5F4]
---> Muove la flag a Dx
004190EB CMP EDX, DWORD PTR [EBP-18]
---> Cosa � EBP-18?
004190EE JGE 00419159
---> jump importante

    Se andiamo a vedere il valore di EBP-18, ( D EBP-18) vediamo che questo � 5; probabilmente nel check che � stato fatto dalla precendente call � stato rilevato che non c'� la chiave hw e il risultato di questo errore (5) � stato messo in EBP-18. Provate a editare la flag di EBP-18 e al posto di 5 mettete 0 ( 0 perch� � il valore che viene attribuito a EDX), in questo modo avverr� il JGE ma ancora non avremo finito di operare: rimane da risolvere il II problema. Procediamo:

00419159 MOV DWORD PTR [0075F5F4], 003F ---> 3F � di solito l'ammontare di dati da leggere nella chiave, quindi le nostre ipotesi precedenti erano giuste!!! :)
00419162 PUSH 0075F1E8
00419167 MOV DX, DWORD PTR [0075F5F4]
00419174 CALL 00568595
--> questa call dovrebbe leggere i dati dalla chiave
00419179 MOV DWORD PTR [EBP-1C], AX
--> i dati da Ax vengono memorizzati in [Ebp-1C]
0041917D MOV DWORD PTR [0075F5F4], 0005
00419186 XOR EAX,EAX
---> inizializza Eax
00419188 MOV AX, DWORD PTR [0075F1E8]
---> Ax = FFFF
0041918E XOR ECX,ECX
---> inizializza Ecx
00419190 MOV CX, DWORD PTR [0075F5F4]
00419197 XOR EDX,EDX
---> inizializza Edx
00419199 MOV DX, DWORD PTR [EBP+2*ECX-28]
---> Dx = 5460h
0041919E CMP EAX,EDX
---> compara Eax a Edx
004191A0 JZ 004191CC
---> Altro jump importante.

    Che fortuna!!! il prg compara Eax con Edx, dove Eax riporta l'errore (FFFF) mentre Edx riporta il valore esatto (5460). A questo punto basterebbe cambiare la flag a Eax portandola = 5460 per ottenere il jump che abilita il prg. Provare per Credere!!!!

Ringraziamenti : A tutto il   mio gruppo preferito RingZer0.